'use strict';
var vk; // 全局vk实例
// 涉及的表名
const dbName = require("../../../dao/config.js");

var db = uniCloud.database(); // 全局数据库引用
var _ = db.command; // 数据库操作符
var $ = _.aggregate; // 聚合查询操作符
/**
 * 权限注意：访问以下链接查看
 * 文档地址：https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/cloudObject.html#内置权限
 */
var cloudObject = {
	isCloudObject: true, // 标记为云对象模式
	/**
	 * 请求前处理，主要用于调用方法之前进行预处理，一般用于拦截器、统一的身份验证、参数校验、定义全局对象等。
	 * 文档地址：https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/cloudObject.html#before-预处理
	 */
	_before: async function() {
		vk = this.vk; // 将vk定义为全局对象
		// let { customUtil, uniID, config, pubFun } = this.getUtil(); // 获取工具包
	},
	/**
	 * 请求后处理，主要用于处理本次调用方法的返回结果或者抛出的错误
	 * 文档地址：https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/cloudObject.html#after-后处理
	 */
	_after: async function(options) {
		let { err, res } = options;
		if (err) {
			return; // 如果方法抛出错误，直接return;不处理
		}
		return res;
	},
	/**
	 * 获取用户信息
	 * @url admin/business/sys.user.getInfo 前端调用的url参数地址
	 */
	getInfo: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id
		} = data;
		if (vk.pubfn.isNull(_id)) return { code: -1, msg: "id不能为空" };
		res.userInfo = await vk.daoCenter.userDao.findById(_id);
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取用户列表
	 * @url admin/business/sys.user.getList 前端调用的url参数地址
	 */
	getList: async function(data) {
		let { uid } = this.getClientInfo(); // 获取客户端信息
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		res = await vk.daoCenter.userDao.getTableDataForClient({
			data,
			sortArr: [{ name: "register_date", type: "desc" }],
			foreignDB: [{
					dbName: dbName.user, // 副表名
					localKey: $.arrayElemAt(['$inviter_uid', 0]), // 主表外键字段名
					foreignKey: "_id", // 副表外键字段名
					as: "inviterUserInfo",
					limit: 1, // 当limit = 1时，以对象形式返回，否则以数组形式返回
				},
				{
					dbName: dbName.userTag,
					localKey: "tags",
					localKeyType: "array",
					foreignKey: "_id",
					as: "tagList",
					fieldJson: {
						_id: 1,
						name: 1
					},
					limit: 20
				}
			]
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 修改用户基础信息
	 * @url admin/business/sys.user.updateBaseInfo 前端调用的url参数地址
	 */
	updateBaseInfo: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id,
			nickname, // 昵称
			comment, // 商家备注
			mobile, // 手机号
			tags = []
		} = data;
		if (vk.pubfn.isNull(_id)) return { code: -1, msg: 'id不能为空' };
		// 验证规则开始 -----------------------------------------------------------
		let rules = {
			nickname: [
				// 必填
				{ required: true, message: '昵称为必填字段', trigger: 'blur' },
				// 长度在 2-20 个字
				{ min: 2, max: 20, message: '昵称长度在 2 到 20 之间', trigger: 'blur' }
			],
			mobile: [
				// 必须是手机号格式
				{ validator: vk.pubfn.validator("mobile"), message: '手机号格式错误', trigger: 'blur' }
			],
			comment: [
				{ min: 0, max: 20, message: '备注长度在 0 到 20 之间', trigger: 'blur' }
			]
		};
		// 验证规则结束 -----------------------------------------------------------
		// 开始进行验证
		let formRulesRes = vk.pubfn.formValidate({
			data: data,
			rules: rules
		});
		if (formRulesRes.code !== 0) {
			// 表单验证未通过
			return formRulesRes;
		}
		// 表单验证通过，下面写自己的业务逻辑
		let dataJson = {
			comment,
			mobile,
			mobile_confirmed: mobile ? 1 : 0,
			tags: _.set(tags)
		};
		await vk.daoCenter.userDao.updateById({
			id: _id,
			dataJson
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 修改用户VIP等级
	 * @url admin/business/sys.user.updateVipLv 前端调用的url参数地址
	 */
	updateVipLv: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id,
			vip_lv, // 等级
		} = data;
		// 参数非空检测
		let nullKey = vk.pubfn.isNullOneByObject({ _id, vip_lv });
		if (nullKey) return { code: -1, msg: '参数 ' + nullKey + ' 不能为空' };
		await vk.daoCenter.userDao.updateVipLv({
			_id,
			lv: vip_lv
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 修改用户分销等级
	 * @url admin/business/sys.user.updateFxLv 前端调用的url参数地址
	 */
	updateFxLv: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id,
			is_fx,
			lv = 0,
		} = data;
		if (vk.pubfn.isNull(_id)) return { code: -1, msg: 'id不能为空' };
		let fxJson = {
			is_fx,
			lv,
			status: 1,
		};
		fxJson["status"] = is_fx ? 1 : _.remove();
		await vk.daoCenter.userDao.updateById({
			id: _id,
			dataJson: {
				fx: fxJson
			}
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 修改用户标签
	 * @url admin/business/sys.user.updateUserTag 前端调用的url参数地址
	 */
	updateUserTag: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id,
			tags = []
		} = data;
		if (vk.pubfn.isNull(_id)) return { code: -1, msg: "id不能为空" };
		if (!vk.pubfn.isArray(tags)) return { code: -1, msg: "参数错误" };
		await vk.daoCenter.userDao.updateById({
			id: _id,
			dataJson: {
				tags: _.set(tags)
			}
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取推荐人选择列表
	 * @url admin/business/sys.user.getInviterSelectList 前端调用的url参数地址
	 */
	getInviterSelectList: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			formData = {}
		} = data;
		let { my_id } = formData;
		let whereJson = {
			"fx.is_fx": 1, // 上级必须已经成为分销员
		};
		if (my_id) {
			whereJson["inviter_uid"] = _.nin([my_id]); // 上级不可以是我的下级
			whereJson["_id"] = _.neq(my_id); // 上级不可以是我自己
		}
		res = await vk.daoCenter.userDao.getTableData({
			data,
			whereJson
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 修改推荐人
	 * @url admin/business/sys.user.updateInviter 前端调用的url参数地址
	 */
	updateInviter: async function(data) {
		let res = { code: 0, msg: '' };
		let { uid } = this.getClientInfo();
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id, // 用户id
			inviter_uid, // 推荐人id
			mode = 1, // 模式 1:正常分享 2:系统分享人 3:无分享人
		} = data;
		res = await vk.daoCenter.userDao.updateInviterUser({
			user_id: _id, // 被分享人
			inviter_id: inviter_uid, // 分享人
			mode: mode, // 1:正常分享 2:系统分享人 3:无分享人
			clientInfo: this.getClientInfo(), // 日志需要
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 修改用户基础信息
	 * @url admin/business/sys.user.updateUserBaseInfo 前端调用的url参数地址
	 */
	updateUserBaseInfo: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id,
			is_service_staff,
			service_staff_introduction,
			social_info,
			is_verify_staff
		} = data;

		if (vk.pubfn.isNull(_id)) return { code: -1, msg: "id不能为空" };

		await await vk.daoCenter.userDao.updateById({
			id: _id,
			dataJson: {
				is_service_staff,
				service_staff_introduction,
				social_info,
				is_verify_staff
			}
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 修改用户余额
	 * @url admin/business/sys.user.updateUserBalance 前端调用的url参数地址
	 */
	updateUserBalance: async function(data) {
		let res = { code: 0, msg: '' };
		let { uid } = this.getClientInfo();
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id, // 用户id
			isAdd, // 1 增加 2 减少
			value, // 变动的数量
			remark, // 备注
			updateTotal, // 是否影响累计
		} = data;

		if (vk.pubfn.isNull(_id)) return { code: -1, msg: "id不能为空" };
		if (vk.pubfn.isNull(isAdd)) return { code: -1, msg: "action不能为空" };
		let addType = isAdd ? "增加" : "扣除";
		// 开启事务
		const transaction = await vk.baseDao.startTransaction();
		try {
			let no = vk.pubfn.createOrderNo("CZ");
			await vk.daoCenter.moneyDao.updateAccountBalanceForTransaction({
				db: transaction,
				user_id: _id,
				value: value, // 此值始终为正整数 100=1元
				isAdd: isAdd, // true 增加 false 减少
				no: no,
				title: `管理员${addType}余额`,
				comment: remark,
				add_type: 1, // 1 人工录入 2 用户线上充值 3 消费 4 退款 5 转账 6 余额转换 7 奖励发放 8 解锁 9 提现 10 提现拒绝后返还
				updateTotal: updateTotal,
				create_uid: uid
			});
			// 提交事务
			await transaction.commit();
			console.log(`transaction succeeded`);
		} catch (err) {
			// 事务回滚
			return await vk.baseDao.rollbackTransaction({
				db: transaction,
				err
			});
		}

		res.userInfo = await vk.daoCenter.userDao.findById(_id);

		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 修改用户积分
	 * @url admin/business/sys.user.updateUserIntegral 前端调用的url参数地址
	 */
	updateUserIntegral: async function(data) {
		let res = { code: 0, msg: '' };
		let { uid } = this.getClientInfo();
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id, // 用户id
			isAdd, // 1 增加 2 减少
			value, // 变动的数量
			remark, // 备注
			updateTotal, // 是否影响累计
		} = data;

		if (vk.pubfn.isNull(_id)) return { code: -1, msg: "id不能为空" };
		if (vk.pubfn.isNull(isAdd)) return { code: -1, msg: "action不能为空" };
		let addType = isAdd ? "增加" : "扣除";
		// 开启事务
		const transaction = await vk.baseDao.startTransaction();
		try {
			let no = vk.pubfn.createOrderNo("CZ");
			await vk.daoCenter.moneyDao.updateAccountIntegralForTransaction({
				db: transaction,
				user_id: _id,
				value: value, // 此值始终为正整数 100=1元
				isAdd: isAdd, // true 增加 false 减少
				no: no,
				title: `管理员${addType}积分`,
				comment: remark,
				add_type: 1, // 1 人工录入 2 用户线上充值 3 消费 4 退款 5 转账 6 余额转换 7 奖励发放 8 解锁 9 提现 10 提现拒绝后返还
				updateTotal: updateTotal,
				create_uid: uid
			});
			// 提交事务
			await transaction.commit();
			console.log(`transaction succeeded`);
		} catch (err) {
			// 事务回滚
			return await vk.baseDao.rollbackTransaction({
				db: transaction,
				err
			});
		}

		res.userInfo = await vk.daoCenter.userDao.findById(_id);

		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 余额转账
	 * @url admin/business/sys.user.balanceTransfer 前端调用的url参数地址
	 */
	balanceTransfer: async function(data) {
		let res = { code: 0, msg: '' };
		let { uid } = this.getClientInfo();
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id, // 用户id
			user_id, // 转账目标用户id
			value, // 转账数量
			remark, // 转账备注
		} = data;

		if (vk.pubfn.isNull(_id)) return { code: -1, msg: "id不能为空" };
		if (vk.pubfn.isNull(user_id)) return { code: -1, msg: "转账目标不能为空" };
		if (user_id === _id) return { code: -1, msg: "不可以转给自己" };
		let transferUserInfo = await vk.daoCenter.userDao.findById(user_id);
		if (vk.pubfn.isNull(transferUserInfo)) return { code: -1, msg: "转账目标不存在" };
		// 开启事务
		const transaction = await vk.baseDao.startTransaction();
		try {
			let no = vk.pubfn.createOrderNo("CZ");
			// 扣除这个
			await vk.daoCenter.moneyDao.updateAccountBalanceForTransaction({
				db: transaction,
				user_id: _id,
				value: value, // 此值始终为正整数 100=1元
				isAdd: false, // true 增加 false 减少
				no: no,
				title: `你转账给【${transferUserInfo.nickname}】`,
				comment: remark,
				add_type: 5, // 1 人工录入 2 用户线上充值 3 消费 4 退款 5 转账 6 余额转换 7 奖励发放 8 解锁 9 提现 10 提现拒绝后返还
				updateTotal: true, // 转账需要影响累计
				create_uid: uid
			});
			// 增加那个
			await vk.daoCenter.moneyDao.updateAccountBalanceForTransaction({
				db: transaction,
				user_id: user_id,
				value: value, // 此值始终为正整数 100=1元
				isAdd: true, // true 增加 false 减少
				no: no,
				title: `由【${transferUserInfo.nickname}】转账给你`,
				comment: remark,
				add_type: 5, // 1 人工录入 2 用户线上充值 3 消费 4 退款 5 转账 6 余额转换 7 奖励发放 8 解锁 9 提现 10 提现拒绝后返还
				updateTotal: true, // 转账需要影响累计
				create_uid: uid
			});

			// 提交事务
			await transaction.commit();
			console.log(`transaction succeeded`);
		} catch (err) {
			// 事务回滚
			return await vk.baseDao.rollbackTransaction({
				db: transaction,
				err
			});
		}

		res.userInfo = await vk.daoCenter.userDao.findById(_id);

		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取标签列表
	 * @url admin/business/sys.user.getTagList 前端调用的url参数地址
	 */
	getTagList: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		res = await vk.daoCenter.userTagDao.getTableData({
			data
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 添加标签
	 * @url admin/business/sys.user.addTag 前端调用的url参数地址
	 */
	addTag: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			name,
			comment
		} = data;
		res._id = await vk.daoCenter.userTagDao.add({
			name,
			comment
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 删除标签
	 * @url admin/business/sys.user.delTag 前端调用的url参数地址
	 */
	delTag: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id
		} = data;
		if (!_id) return { code: -1, msg: "_id不能为空" };
		await vk.daoCenter.userTagDao.deleteById(_id);
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取用户余额明细
	 * @url admin/business/sys.user.getBalanceRecords 前端调用的url参数地址
	 */
	getBalanceRecords: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		res = await vk.baseDao.getTableData({
			dbName: dbName.balanceRec,
			data
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取用户奖励明细
	 * @url admin/business/sys.user.getRewardRecords 前端调用的url参数地址
	 */
	getRewardRecords: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		res = await vk.baseDao.getTableData({
			dbName: dbName.rewardRec,
			data
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取用户积分明细
	 * @url admin/business/sys.user.getIntegralRecords 前端调用的url参数地址
	 */
	getIntegralRecords: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		res = await vk.baseDao.getTableData({
			dbName: dbName.integralRec,
			data
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取用户业绩明细
	 * @url admin/business/sys.user.getUserGoodsPer 前端调用的url参数地址
	 */
	getUserGoodsPer: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let { formData = {} } = data;
		let { user_id } = formData;
		let whereJson = {};
		if (user_id) {
			whereJson["inviter_uid.0"] = user_id;
		}
		res = await vk.baseDao.getTableData({
			dbName: dbName.userGoodsPer,
			data,
			whereJson
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取用户提现方式
	 * @url admin/business/sys.user.getUserWithdrawalWay 前端调用的url参数地址
	 */
	getUserWithdrawalWay: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		res = await vk.daoCenter.withdrawalWayDao.getTableData({
			data
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 添加或修改提现方式
	 * @url admin/business/sys.user.editWithdrawalWay 前端调用的url参数地址
	 */
	editWithdrawalWay: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id, // 提现方式id
			user_id, // 用户id
			mode, // add 添加 update 修改
			type, // 提现方式 （1:支付宝,2:微信,3:银行卡)
			bank_name, // 银行名称
			bank_open, // 开户行
			account_no, // 账号
			name, // 姓名
			mobile, // 手机号
			comment, // 备注
			is_default, // 是否默认
		} = data;
		res = await vk.daoCenter.withdrawalWayDao.editWithdrawalWay({
			_id,
			user_id,
			mode,
			type,
			bank_name,
			bank_open,
			account_no,
			name,
			mobile,
			comment,
			is_default
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 删除用户提现方式
	 * @url admin/business/sys.user.deleteUserWithdrawalWay 前端调用的url参数地址
	 */
	deleteUserWithdrawalWay: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id
		} = data;
		if (vk.pubfn.isNull(_id)) return { code: -1, msg: "id不能为空" };
		res.num = await vk.daoCenter.withdrawalWayDao.deleteById(_id);
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 模板函数
	 * @url admin/business/sys.user.test 前端调用的url参数地址
	 */
	test: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------


		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
};

module.exports = cloudObject;
